Service Injecting

Sono presenti vari modi per poter utilizzare i servizi registrati nell’applicativo ma uno dei più performanti e comodi è chiamato Service Injecting e consiste nella richiesta di un servizio tramite la dichiarazione di un parametro o di un costruttore

Nota

Resta comunque possibile l’utilizzo dei servizi registrati attraverso il ServiceProvider correlato. Esso può essere trovato nell”HttpContext nella proprietà RequestServices oppure nell”IApplicationBuilder nella proprietà ApplicationServices

In applicativi ASP.NET Core sono presenti principalmente tre tipi di injecting supportati
Costruttore

L’injecting per costruttore consiste nell’inserire i servizi richiesti nel costruttore di un proprio servizio/controller e di lasciar fare al ServiceProvider la risoluzione e validazione dei servizi necessari

public HomeController(SomeFancyService fancyService, SomeFancyOptionalService fancy = null) {
    _fancyService = fancyService;
    _fancy = fancy;
}
Annotation

L’injecting per annotation è consentito solo nei controller e permette di usare servizi specifici per una data azione senza doverli risolvere ad ogni richiesta per tutte le azioni del controller.

Per richiedere un servizio è sufficiente aggiungerlo come parametro e annotarlo con l’attributo FromServices

private IActionResult GetData(
    [FromQuery] string paramter,
    [FromServices] DataProvider provider,
    [FromServices] OptionalService service = null) {
    // Some fancy stuff
    return aResultVariable;
}
Razor

L’injecting per le pagine o view Razor, invece, si svolge tramite la langword @inject nella sintassi @inject SomeService SomeVariableName che renderà disponibile il servizio richiesto nella pagina nella proprietà con il nome specificato

Nota

Quando in una pagina razor viene definito un servizio l’engine aggiungerà il servizio richiesto al costruttore della pagina e ne assegnerà il valore ad una proprietà protetta (readonly) con il nome scelto

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;

namespace Example.Controllers {
	[Authorize]
	public class HomeController : Controller {
	    private readonly SomeFancyService _fancyService;
	    [CanBeNull]
	    private readonly SomeFancyOptionalService _fancy;

	    public HomeController(SomeFancyService fancyService, SomeFancyOptionalService fancy = null) {
	        _fancyService = fancyService;
	        _fancy = fancy;
	    }

		public IActionResult Index() {
			return View();
		}

		[HttpGet("FancyData")]
		private IActionResult GetData(
		    [FromQuery] string paramter,
		    [FromServices] DataProvider provider,
		    [FromServices] OptionalService service = null) {
		    // Some fancy stuff
		    return aResultVariable;
		}

		[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true), Route("error")]
		public IActionResult Error() {
			return View(new ErrorViewModel {RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier});
		}
	}
}

Nota

Per dichiarare un servizio come opzionale sarà sufficiente segnare il parametro come opzionale (vedi riga 15 e 28)